function request______(js_obj){
  // console.log("js_obj",js_obj)
    //js_obj.method       请求格式是get 还是post  还是put  还是delete
    var method =js_obj.method;
    var onerror= js_obj.onerror!=null ? js_obj.onerror : function(){}
    var error_run_func=  js_obj.error_run_func!=null ? js_obj.error_run_func : function(){}
    var onnetworkerror= js_obj.onnetworkerror!=null ? js_obj.onnetworkerror : function(){}
    let url_ = js_obj.url;
    return function(js_obj2){
        //js_obj2.head_data    存放在url上的json数据
        //js_obj2.body_data    存放在body上的json数据
        //js_obj2.url          url
        let head_data=js_obj2.head_data;
        let body_data=js_obj2.body_data;
        // console.log('method:',method)
        // console.log('head_data:',head_data)
        // console.log('body_data:',body_data)
        // console.log(' ')
        let execute_lst=js_obj2.execute_lst;
        let url=url_;
        if (url==null){throw new Error('不能缺少url参数');}//缺少url就抛出异常
        if (head_data!=null){url=url+'?'+JSON.stringify(head_data)}//如果head_data不为空  就将head_data转为json格式存入url
        if (js_obj2.body_data!=null &&(method.toLowerCase()=='post' ||method.toLowerCase()=='put'  )){body_data=JSON.stringify(body_data)}else{body_data="{}"}//如果为post 或者 put 将body_data转为json格式
        let xhr = new XMLHttpRequest();
        xhr.open(method, url, true);
        xhr.onload = function() {
      if (xhr.status === 200) {
        // 请求成功，将返回的 JSON 数据解析为对象，并传递给回调函数
        // console.log('xhr.responseText',xhr.responseText)
        // console.log('typeof',typeof xhr.responseText,xhr.responseText)
        var received_data = JSON.parse(xhr.responseText);
        if (received_data.type=='error'){
          Vue.prototype.$notify({type: 'error',message: received_data.message||'错误'})
          console.log("dddd",error_run_func)
          error_run_func(received_data)
          return null
        }else if(received_data.type=='ok' || received_data.type=='success' ){
          // console.log("received_data.type 22",received_data)
          Vue.prototype.$notify({type: 'success',message: received_data.message||'操作成功'})
        }
        // console.log("received_data.type",received_data.type)
        if (execute_lst==null)execute_lst=[]
        for (let i=0;i<execute_lst.length;i++){
            let item=execute_lst[i];
            // console.log(`######execute_lst[${i}]`,execute_lst)
            
            if (item.type=='func'){//运行函数
              let temp_func=item.func//传递进来的函数
              if (temp_func==null)continue;
              let args=  item.args;     
              // console.log('###args1###',args)
              let kwargs=  item.kwargs;      
              if (args==null){args=[]}    
              if (kwargs==null){kwargs={}}
              // console.log('###args2###',args)
              // args=['44','44']
              // kwargs={'ww':44,'ee':33}
              // 我要将args=的数组索引和kwargs的属性 统一存入temp_idx数组中 temp_idx格式为[['args',0],['args',1],['kwargs','ww'],['kwargs','ee']]
              // 你可以使用JavaScript的Object.keys()和Array.prototype.map()方法来获取kwargs的键和args的索引
              let temp_idx =[]
              for (let eee=0;eee<args.length;eee++){
                temp_idx.push(['args', eee])
              }
              temp_idx=temp_idx.concat(Object.keys(kwargs).map(key => ['kwargs', key])); 
              // console.log('###args3###',args)
              for (let ii_args=0;ii_args<temp_idx.length;ii_args++){
                      let iitem=temp_idx[ii_args];//['args',1]  ['kwargs','ee']
                      let data___=null;
                      let temp_iitem=null
                      if (iitem[0]=='args'){temp_iitem=args[iitem[1]]}else{temp_iitem=kwargs[iitem[1]]}
                      // console.log('temp_iitem',temp_iitem)
                      // console.log('Array.isArray(temp_iitem)',Array.isArray(temp_iitem))
                      // console.log('temp_iitem',temp_iitem)
                      if (typeof temp_iitem === 'string'){
                        data___=received_data;           //获取变量地址
                        // console.log('str!!!',data___,received_data)
                        let temp_lst=temp_iitem.split('.');          //拆分数组
                        let last_name=temp_lst[temp_lst.length-1];//最后一个变量的名字
                        for (let ii=0;ii<temp_lst.length-1;ii++){data___=data___[temp_lst[ii]]}
                        data___=data___[last_name]
                        if (temp_iitem=='received_data')data___=received_data
                      }else if(Array.isArray(temp_iitem)){
                        
                        data___=temp_iitem[0];           //获取变量地址
                        // console.log('ddddd111',data___)
                        let temp_lst=temp_iitem[1].split('.');          //拆分数组
                        let last_name=temp_lst[temp_lst.length-1];//最后一个变量的名字
                        for (let ii=0;ii<temp_lst.length-1;ii++){data___=data___[temp_lst[ii]]}
                        // console.log('ddddd2222',data___,last_name)
                        data___=data___[last_name]
                      }
                      
                      //  console.log(  '###args5###',args)
                      //  console.log('iitem',iitem)
                      if (iitem[0]=='args'){args[iitem[1]]=data___}
                      else if (iitem[0]=='kwargs'){kwargs[iitem[1]]=data___}
                      
                      // console.log(  '###args6###',args)
                    }
              let args_str='';
              if (args.length!=0){
                // console.log('errrrrrr  args',args);
              args_str='args['+args.map((value, index) => index).join('],args[')+']';}
              let kwargs_str='';
              let kwargs_key_lst=Object.keys(kwargs).map(key => key);
              for (let fjsdlakfj=0;fjsdlakfj<kwargs_key_lst.length;fjsdlakfj++){
              kwargs_str=kwargs_str+','+kwargs_key_lst[fjsdlakfj]+'='+'kwargs['+kwargs_key_lst[fjsdlakfj]+']'
              }
              // console.log(args_str,kwargs_str);
              let tttemp_str='';
              if (args_str==''&&kwargs_str!=''){tttemp_str="temp_func("+kwargs_str.substring(1, str.length)+")"}
              else{tttemp_str="temp_func("+args_str+kwargs_str+")"}
              // console.log('###args4###',args)
              // console.log("%%%%%%%%",args[0])
                // console.log('args',args)
              // eval('console.log("%%%%%%%%",args[0])')
              // console.log('eval::::',tttemp_str)
              // console.log('item:',item)
              // console.log('item.args_',item.args_)
              if (item.args_!=null)tttemp_str="temp_func("+item.args_.map((item, index) => `item.args_[${index}]`).join(',')+")"
              if (item.kwargs_!=null){
                // console.log('kwargs_',item.kwargs);
              
              tttemp_str="temp_func("+Object.keys(item.kwargs_).map(x => x+'=item.kwargs_["'+x+'"]').join(',')+")"}
              // console.log('eval::::',tttemp_str)
              // console.log('temp_func',temp_func)
              if (args!=null){for (let iiis=0;iiis<args.length;iiis++){
                // console.log(`args[${iiis}]`,args[iiis])
              }}
               if (item.timesleep!=null)setTimeout(eval(tttemp_str),item.timesleep)//如果需要则延时执行
               else{eval(tttemp_str)}//不延时直接执行
  
            }
            else if (item.type=='set_val'){
              let val1=item.val1
              let val2=item.val2
              let data___1=null;
              let temp_lst1=[]
              let data___2=null;
              let temp_lst2=[]
              if (typeof val1 === 'string'){data___1=received_data;temp_lst1=val1.split('.')}else{data___1=val1[0];temp_lst1=val1[1].split('.')}
              if (typeof val2 === 'string'){data___2=received_data;temp_lst2=val2.split('.')}else{data___2=val2[0];temp_lst2=val2[1].split('.')}
              let last_name1=temp_lst1[temp_lst1.length-1];//最后一个变量的名字
              for (let ii=0;ii<temp_lst1.length-1;ii++){data___1=data___1[temp_lst1[ii]]}
              let last_name2=temp_lst2[temp_lst2.length-1];//最后一个变量的名字
              // console.log('data:',last_name2)
              // console.log(JSON.stringify(data___2))
              // console.log(JSON.stringify(data___2[last_name2]))
              data___1[last_name1]=data___2[last_name2];
              // console.log('data___1',data___1)
              // console.log('data___1[last_name1]',data___1[last_name1])
              // console.log('data___2',data___1)
              // console.log('data___2[last_name2]',data___2[last_name2])
              if (val2=='received_data'){data___1[last_name1]=received_data}
            }
        }
      } else {
        // 请求失败，运行回调函数
       onerror(xhr.status);
      }
    };
  
    xhr.onerror = function() {
      // 网络错误，运行回调函数
      onnetworkerror();
    };
  
    // 发送请求 
        if (method.toLowerCase()=='post' ||method.toLowerCase()=='put'  ){xhr.send(JSON.stringify(body_data));}
        else{xhr.send()}
    
  };
  }

// var func=function(data1,data2,eee,ww=5,rr=2){console.log('test_func',data1,data2,eee,ww,rr)}
// var ttteeesssttt_get=request______({method:'get',url:'/V1/color'})
// ttteeesssttt_get({
//     head_data:{"limit":[1,20]},
//     //type=func   表示运行函数 func为要运行的函数    args和kwargs为类似python的args和kwargs传参
//     //            传参的值[data1,'ddd.dd']代表 值为data1[ddd][dd] 传参的值为'count'代表 服务器传递回来的值[count]
//     //type=set_val 表示进行赋值操作 因为使用的是地址 修改后也代表原变量也被修改了
//     //            'val1':[data1,'ddd.dd'],'val2':[data2,'ddd.dd'] 表示  data1[ddd][dd]=data2[ddd][dd]
//     //            'val1':[data1,'ddd.dd'],'val2':'ddd.dd' 表示  data1[ddd][dd]=服务器传递回来的值[ddd][dd]
//     execute_lst:[
//                   {
//                     'type':'func',
//                     'func':func,
//                     'args':[[data1,'ddd.dd'],
//                     [data2,'ddd.dd'],
//                     'count',
//                     ],
//                   'kwargs':{rr:[data2,'ddd.dd']},
//                   },


//                   {'type':'set_val',
//                   'val1':"aaa",
//                   'val2':[data2,'ddd.dd']
//                   }
//     ]
// })